//go:build ignore

package main

import "fmt"

func main() {

	/*// demo1
	// 定义pos,neg 2个函数闭包
	pos, neg := addr(), addr()
	for i := 0; i < 10; i++ {
		fmt.Println(pos(i), neg(-2*i))
	}*/

	// demo2
	// fibonacci closure demo
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}

// 函数闭包,是一个函数值,它引用了函数体之外的变量,该函数体可以访问并赋予其引用的变量值,
// 换句话说,该函数被"绑定"到了这些变量上
func addr() func(int) int {
	sum := 0
	return func(i int) int {
		sum += i
		return sum
	}
}

// fibonacci 是返回一个「返回一个 int 的函数」的函数
func fibonacci() func() int {
	x, y := 0, 1
	return func() int {
		f := x
		x, y = y, f+y

		return f
	}
}
